package com.taotao.rest.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.alibaba.druid.support.logging.Log;
import com.taotao.common.util.JsonUtils;
import com.taotao.mapper.TbItemCatMapper;
import com.taotao.pojo.TbItemCat;
import com.taotao.pojo.TbItemCatExample;
import com.taotao.pojo.TbItemCatExample.Criteria;
import com.taotao.rest.dao.JedisClient;
import com.taotao.rest.pojo.CatNode;
import com.taotao.rest.pojo.CatResult;
import com.taotao.rest.service.ItemCatService;

/**
 * 
 * @author fangys
 * @version 创建时间：2016年11月19日 上午11:39:03
 */
@Service
public class ItemCatServiceImpl implements ItemCatService{
	
	
	@Autowired
	private TbItemCatMapper itemCatMapper;
	
	
	//jedis注入
	@Autowired
	private JedisClient jedisClient;
	
	@Value("${INDEX_ITEMCAT_REDIS_KEY}")
	private String INDEX_ITEMCAT_REDIS_KEY;
	
	/**
	 * 查询所有分类
	 * @return
	 */
	@Override
	public CatResult getItemCatList() {
		CatResult catResult = new CatResult();
		//查询分类列表
		catResult.setData(getCatList(0));
		return catResult;
	}
	
	/**
	 * 查询分类列表
	 * <p>Title: getCatList</p>
	 * <p>Description: </p>
	 * @param parentId
	 * @return
	 */
	private List<?> getCatList(long parentId){
		//从redis中获取
		try{
			String result = jedisClient.hget(INDEX_ITEMCAT_REDIS_KEY, parentId+"");
			//如果能取得到数据
			if (!StringUtils.isBlank(result)) {
				//把字符串转换成list
				List<TbItemCat> resultList = JsonUtils.jsonToList(result, TbItemCat.class);
				return resultList;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		//上面取不到就会去数据库查
		
		//创建查询条件
		TbItemCatExample example = new TbItemCatExample();
		Criteria criteria = example.createCriteria();
		//用父id去查
		criteria.andParentIdEqualTo(parentId);
		//执行查询
		List<TbItemCat> list = itemCatMapper.selectByExample(example);
		//返回list 不规定他的泛型,因为如果有子节点则添加catNode,没有则添加文本
		List resultList = new ArrayList<>();
		int count = 0;
		//向list中添加节点
		for(TbItemCat tbItemCat : list){
			//分类信息节点
			CatNode catNode = new CatNode();
			
			//如果是叶子节点
			if(!tbItemCat.getIsParent()){
				//则没有u n  i ,只有一个文本
				resultList.add("/products/"+tbItemCat.getId()+".html|"+tbItemCat.getName());
			}else{
				//如果这是第一节
				if(tbItemCat.getParentId() == 0){
					catNode.setName("<a href='/products/"+tbItemCat.getId()+".html'>"+tbItemCat.getName()+"</a>");
				}else{
					catNode.setName(tbItemCat.getName());
				}
				catNode.setUrl("/products/"+tbItemCat.getId()+".html");
				catNode.setItem(getCatList(tbItemCat.getId()));
				resultList.add(catNode);
				
				count++;//控制只能显示14个一级分类
				if(tbItemCat.getParentId() == 0 && count >= 14){
					break;
				}
			}
		}
		//把从数据库查的保存到缓存中,下次就可以从缓存中取
		try{
			String resultJson = JsonUtils.objectToJson(resultList);
			jedisClient.hset(INDEX_ITEMCAT_REDIS_KEY, parentId+"", resultJson);
		}catch(Exception e) {
			//一定要用try catch处理,如果发生异常还能继续往下执行,去mysql查,而不会因为redis取不到就报异常
			e.printStackTrace();
		}
		return resultList;
	}
	
}
